package com.kevinkk.string;

/**
 * 给你一个字符串 s ，请你反转字符串中 单词 的顺序。
 * 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
 * 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
 * 注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。
 */

/**
 * 总体思路是 先做格式化处理，然后将整个字符串整体反转 最后再逐一反转每个单词
 * 字符串的 trim() 方法只能去除字符串前后多余的空格，具体字符串里面多余的空格可以用 replaceAll 搭配正则表达式进行处理
 * \s 表示的是空格，而又由于 \ 是转译字符，因此还需要在前面再加一个 \
 * + 是一个量词，表示多次出现
 */

public class ReverseWordsInAString {
    class Solution {
        public String reverseWords(String s) {
            char[] c = s.trim().replaceAll("\\s+", " ").toCharArray();
            int length = c.length;
            reverse(c, 0, length - 1);
            int i = 0;
            while (i < length) {
                int j = i + 1;
                while (j < length && c[j] != ' ')
                    j++;
                reverse(c, i, j - 1);
                i = j + 1;
            }
            return new String(c);
        }

        private void reverse(char[] c, int i, int j) {
            while (i < j) {
                char temp = c[i];
                c[i] = c[j];
                c[j] = temp;
                i++;
                j--;
            }
        }
    }
}
